#include "coletascontroller.h"
#include "dao/trcoletadao.h"
#include "dao/trcoletaitemdao.h"
#include "dao/trforncoletadao.h"
#include "dao/trforncoletaitemdao.h"
#include "produtoscontroller.h"
#include <QDateTime>

ColetasController::ColetasController(QObject *parent) :
    QObject(parent)
{
}

QVariantList ColetasController::loadProdutosColeta(qulonglong fornColetaId)
{
    QVariantList result;

    ProdutosController produtosController;
    TRFORNCOLETAITEMDAO trFornColetaItemDAO;

    GenericListModel *trFornColetaItems = trFornColetaItemDAO.findAll(QString("ID_FORNCOLETA=").append(QString::number(fornColetaId)));
    if(trFornColetaItems) {
        QList<QObject *> entries = trFornColetaItems->getEntries();
        for(int i=0; i<entries.length(); i++) {
            TRFORNCOLETAITEM *trFornColetaItem = (TRFORNCOLETAITEM *)entries[i];
            QVariantMap dadosProduto = produtosController.loadDadosProduto(trFornColetaItem->ID_Produto());
            result.append(dadosProduto);
        }
        delete trFornColetaItems;
    }

    return result;
}

TRCOLETA *ColetasController::localizaColetaEmAndamento(qulonglong fornColetaId)
{
    TRCOLETA *result = 0;
    TRCOLETADAO dao;

    GenericListModel *coletas = dao.findAll(QString("ID_FORNCOLETA=").append(QString::number(fornColetaId)));

    if(coletas) {
        QList<QObject *> entries = coletas->getEntries();
        if(!entries.isEmpty()) {
            result = (TRCOLETA *)entries[0];
            result->setParent(0);
        }
        delete coletas;
    }

    return result;
}

TRCOLETAITEM *ColetasController::localizaItemColetado(TRCOLETA *trColeta, qulonglong produtoId)
{
    TRCOLETAITEM *result = 0;
    TRCOLETAITEMDAO dao;

    GenericListModel *list = dao.findAll(QString("ID_Coleta=").append(QString::number(trColeta->mId()))
                                         .append(" and ID_Produto=").append(QString::number(produtoId)));
    if(list) {
        QList<QObject *> entries = list->getEntries();
        if(!entries.isEmpty()) {
            result = (TRCOLETAITEM *) entries[0];
            result->setParent(0);
        }
        delete list;
    }

    return result;
}

TRCOLETAITEM *ColetasController::localizaItemColetado(qulonglong fornecedorId, qulonglong produtoId)
{
    TRCOLETAITEM *result = 0;
    TRCOLETAITEMDAO dao;

    TRFORNCOLETA *trFornColeta = loadColetaFornecedor(fornecedorId);

    if(trFornColeta) {
        TRCOLETA *trColeta = localizaColetaEmAndamento(trFornColeta->mId());
        if(trColeta) {
            result = localizaItemColetado(trColeta,produtoId);
            delete trColeta;
        }
        delete trFornColeta;
    }

    return result;


}

TRFORNCOLETA *ColetasController::loadColetaFornecedor(qulonglong fornecedorId)
{
    TRFORNCOLETA *result = 0;

    TRFORNCOLETADAO trFornColetaDAO;

    GenericListModel *trFornColetas = trFornColetaDAO.findAll(QString("ID_Fornecedor=").append(QString::number(fornecedorId)));
    if(trFornColetas) {
        QList<QObject *> entries = trFornColetas->getEntries();
        if(!entries.isEmpty()) {
            result = (TRFORNCOLETA *)entries[0];
            result->setParent(0);
        }
        delete trFornColetas;
    }

    return result;
}

TRCOLETA *ColetasController::loadColeta(qulonglong fornecedorId)
{
    TRCOLETA *result = 0;

    TRFORNCOLETA *fornColeta = loadColetaFornecedor(fornecedorId);
    if(fornColeta) {
        result = localizaColetaEmAndamento(fornColeta->mId());
        if(!result) {
            result = new TRCOLETA();
            result->setmId(QDateTime::currentMSecsSinceEpoch());
            result->setID_Fornecedor(fornecedorId);
            result->setID_FORNCOLETA(fornColeta->mId());
            result->setInfoColeta(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));

            TRCOLETADAO trColetaDAO;
            trColetaDAO.save(result,true);
        }
        delete fornColeta;
    }

    return result;
}

bool ColetasController::salvarColetaItem(qulonglong idFornecedor, qulonglong idProduto, qulonglong idEmbalagemProduto,
                                         QString preco, QString dataValidade, QString ehPromocao, QString dataValidadePromocao,
                                         QString qtdeMinima, QString qtdeMaxima, QString indisponivel, QString obs)
{
    bool result = false;

    qDebug( QString("SAVE: ").append(QString::number(idFornecedor)).append(" ").append(QString::number(idProduto))
            .append(" ").append(QString::number(idEmbalagemProduto)).append(" ").append(preco).append(" ")
            .append(dataValidade).append(" ").append(ehPromocao).append(" ").append(dataValidadePromocao)
            .append(qtdeMinima).append(" ").append(qtdeMaxima).append(" ").append(indisponivel).append(" ")
            .append(obs).toUtf8() );
    TRCOLETA *trColeta = loadColeta(idFornecedor);
    if(trColeta) {
        TRCOLETAITEM *item = localizaItemColetado(trColeta,idProduto);

        bool saveWithId = false;
        if(!item) {
            item = new TRCOLETAITEM();
            saveWithId = true;
            item->setmId(QDateTime::currentMSecsSinceEpoch());
            item->setID_Produto(idProduto);
            item->setID_Coleta(trColeta->mId());
        }

        item->setID_EmbalagemProduto(idEmbalagemProduto);
        item->setPreco(preco);
        item->setValidade(dataValidade);
        item->setPromocao(ehPromocao);
        item->setPromocaoValidade(dataValidadePromocao);
        item->setQtdeMinima(qtdeMinima);
        item->setQtdeMaxima(qtdeMaxima);
        item->setIndisponivel(indisponivel);
        item->setOBS(obs);

        if(trColeta->Finalizada()=="1") {
            item->setFinalizada("1");
        }

        TRCOLETAITEMDAO dao;
        dao.save(item,saveWithId);
        delete item;
        delete trColeta;

        result = true;
    }



    return result;
}

bool ColetasController::deletarColetaItem(qulonglong idFornecedor, qulonglong idProduto)
{
    TRFORNCOLETA *fornColeta = loadColetaFornecedor(idFornecedor);
    bool result = false;

    if(fornColeta) {
        TRCOLETA *trColeta = localizaColetaEmAndamento(fornColeta->mId());

        if(trColeta) {
            TRCOLETAITEM *item = localizaItemColetado(trColeta,idProduto);

            if(item) {
                TRCOLETAITEMDAO dao;
                result = dao.deleteById(item->mId());
                delete item;
            }

            delete trColeta;
        }

        delete fornColeta;
    }


    return result;
}

bool ColetasController::finalizarColeta(qulonglong idFornecedor)
{
    bool result = false;
    TRCOLETA *trColeta = loadColeta(idFornecedor);


    if(trColeta) {
/*
        ProdutosController produtosController;
        QVariantList produtos = produtosController.loadDadosProdutos(idFornecedor);
        for(int i=0; i<produtos.length(); i++) {
            QVariantMap produto = produtos.at(i).toMap();
            if(produto["status"]=="NAO_COLETADO") {
                salvarColetaItem(idFornecedor,produto["id"].toULongLong(),0,"","","0","","","","1","INDISPONIVEL");
            }
        }
*/

        TRFORNCOLETA *trFornColeta = loadColetaFornecedor(idFornecedor);
        if(trFornColeta) {
            QVariantList produtos = loadProdutosColeta(trFornColeta->mId());
            TRCOLETAITEMDAO itemDAO;

            for(int i=0; i<produtos.length(); i++) {
                QVariantMap dados = produtos.at(i).toMap();
                TRCOLETAITEM *trColetaItem = localizaItemColetado(trColeta,dados.value("id").toULongLong());
                if(trColetaItem) {
                    trColetaItem->setFinalizada("1");
                    itemDAO.save(trColetaItem);
                    delete trColetaItem;
                }
            }

            delete trFornColeta;
        }

        TRCOLETADAO dao;
        trColeta->setFinalizada("1");
        dao.save(trColeta);
        delete trColeta;

        result = true;
    }

    return result;
}
